package droid.frame.ui.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import droid.frame.ui.utils.Utils;

public class ProgressBarCircularIndeterminate extends BaseProgressBar {

	final static String ANDROIDXML = "http://schemas.android.com/apk/res/android";

	int backgroundColor = Color.parseColor("#1E88E5");

	public ProgressBarCircularIndeterminate(Context context, AttributeSet attrs) {
		super(context, attrs);
		setAttributes(context, attrs);

	}

	// Set atributtes of XML to View
	protected void setAttributes(Context context, AttributeSet attrs) {
		setMinimumHeight(Utils.dpToPx(32, getResources()));
		setMinimumWidth(Utils.dpToPx(32, getResources()));
		// Color by resource
		int bacgroundColor = attrs.getAttributeResourceValue(ANDROIDXML, "background", -1);
		if (bacgroundColor != -1) {
			setBackgroundColor(getResources().getColor(bacgroundColor));
		} else {
			// Color by hexadecimal
			int background = attrs.getAttributeIntValue(ANDROIDXML, "background", -1);
			if (background != -1) {
				setBackgroundColor(background);
			} else {
				// Set background Color
				int[] arr = new int[] { android.R.attr.background };
				TypedArray typedArray = context.obtainStyledAttributes(attrs, arr);
				TypedValue typeValue = typedArray.peekValue(0);
				if (typeValue.type == TypedValue.TYPE_INT_COLOR_RGB8) {
					background = typedArray.getColor(0, -1);
					setBackgroundColor(background);
				}
				typedArray.recycle();
				if (background == -1) {
					setBackgroundColor(Color.parseColor("#1E88E5"));
				}
			}
		}
		setMinimumHeight(Utils.dpToPx(3, getResources()));
	}

	/**
	 * Make a dark color to ripple effect
	 * 
	 * @return
	 */
	protected int makePressColor() {
		int r = (this.backgroundColor >> 16) & 0xFF;
		int g = (this.backgroundColor >> 8) & 0xFF;
		int b = (this.backgroundColor >> 0) & 0xFF;
		// r = (r+90 > 245) ? 245 : r+90;
		// g = (g+90 > 245) ? 245 : g+90;
		// b = (b+90 > 245) ? 245 : b+90;
		return Color.argb(128, r, g, b);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// if (firstAnimationOver == false) {
		// drawFirstAnimation(canvas);
		// }
		// if (count > 0) {
		drawSecondAnimation(canvas);
		// }
		invalidate();
	}

	float radius1 = 0;
	float radius2 = 0;
	int count = 0;
	boolean firstAnimationOver = false;

	/**
	 * Draw first animation of view
	 * 
	 * @param canvas
	 */
	@SuppressWarnings("unused")
	private void drawFirstAnimation(Canvas canvas) {
		if (radius1 < getWidth() / 2) {
			Paint paint = new Paint();
			paint.setAntiAlias(true);
			paint.setColor(makePressColor());
			radius1 = radius1 + 2;// 增量控制变幻进度
			canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius1, paint);
		} else {
			Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
			Canvas temp = new Canvas(bitmap);
			Paint paint = new Paint();
			paint.setAntiAlias(true);
			paint.setColor(makePressColor());
			temp.drawCircle(getWidth() / 2, getHeight() / 2, getHeight() / 2, paint);
			Paint transparentPaint = new Paint();
			transparentPaint.setAntiAlias(true);
			transparentPaint.setColor(getResources().getColor(android.R.color.transparent));
			transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
			if (count >= 50) {
				radius2 = (radius2 >= getWidth() / 2) ? (float) getWidth() / 2 : radius2 + 1;
			} else {
				radius2 = (radius2 >= getWidth() / 2 - Utils.dpToPx(4, getResources())) ? (float) getWidth() / 2 - Utils.dpToPx(4, getResources()) : radius2 + 1;
			}
			temp.drawCircle(getWidth() / 2, getHeight() / 2, radius2, transparentPaint);
			canvas.drawBitmap(bitmap, 0, 0, new Paint());
			if (radius2 >= getWidth() / 2 - Utils.dpToPx(4, getResources())) {
				count += 5;
			}
			if (radius2 >= getWidth() / 2) {
				firstAnimationOver = true;
			}
		}
	}

	int arcD = 1;
	int arcO = 0;
	float rotateAngle = 0;
	int limite = 0;

	/**
	 * Draw second animation of view
	 * 
	 * @param canvas
	 */
	private void drawSecondAnimation(Canvas canvas) {
		if (arcO == limite) {
			arcD += 6;
		}
		if (arcD >= 290 || arcO > limite) {
			arcO += 6;
			arcD -= 6;
		}
		if (arcO > limite + 290) {
			limite = arcO;
			arcO = limite;
			arcD = 1;
		}
		rotateAngle += 4;
		canvas.rotate(rotateAngle, getWidth() / 2, getHeight() / 2);

		Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
		Canvas temp = new Canvas(bitmap);
		Paint paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(backgroundColor);
		// temp.drawARGB(0, 0, 0, 255);
		temp.drawArc(new RectF(0, 0, getWidth(), getHeight()), arcO, arcD, true, paint);
		Paint transparentPaint = new Paint();
		transparentPaint.setAntiAlias(true);
		transparentPaint.setColor(getResources().getColor(android.R.color.transparent));
		transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
		// 第三个参数值越大、进度条的线条越细
		temp.drawCircle(getWidth() / 2, getHeight() / 2, (getWidth() / 2) - Utils.dpToPx(2, getResources()), transparentPaint);

		canvas.drawBitmap(bitmap, 0, 0, new Paint());
	}

	// Set color of background
	public void setBackgroundColor(int color) {
		super.setBackgroundColor(getResources().getColor(android.R.color.transparent));
		if (isEnabled()) {
			beforeBackground = backgroundColor;
		}
		this.backgroundColor = color;
	}

}
